package delphorm.service.questionnaire;

import java.util.List;

import delphorm.entite.personne.Utilisateur;
import delphorm.entite.questionnaire.InstanceQuestionnaire;
import delphorm.entite.questionnaire.Questionnaire;
import delphorm.entite.questionnaire.ValeurFichier;
import delphorm.service.exception.ServiceException;

/**
 * Classe de service concernant les questionnaires. Permet de lire, écrire, ...
 * des qestionnaires et ses instances.
 * 
 * @author jerome
 * 
 */
public interface IQuestionnaire {

	/**
	 * Constante de tri par titre
	 */
	public final static String TRI_TITRE = "titre";

	/**
	 * Enregistre le questionnaire passé en paramètre
	 * 
	 * @param questionnaire
	 *            Questionnaire à enregistrer
	 * @return Le Questionnaire enregistré
	 */
	public Questionnaire enregistrerQuestionnaire(Questionnaire questionnaire);

	/**
	 * @param auteur
	 *            Auteur du questionnaire
	 * @return Une instance de questionnaire dont l'état, la date et l'auteur
	 *         sont valués
	 */
	public Questionnaire nouveauQuestionnaire(Utilisateur auteur);

	/**
	 * Lister tous les questionnaires d'un utilisateur
	 * 
	 * @param utilisateur
	 *            Utilisateur dont on souhaite lister les questionnaires
	 * @param trier
	 *            Type de tri à appliquer à la liste
	 * @return La liste de questionnaires de l'utilisateur triée.
	 */
	public List<Questionnaire> listerQuestionnairesUtilisateur(
			Utilisateur utilisateur, String trier);

	/**
	 * Liste tous les questionnaires sans critère de sélection
	 * 
	 * @param trier
	 *            Type de tri de la liste (voir constantes TRI_*
	 * @return La liste des questionnaire triée.
	 */
	public List<Questionnaire> listerQuestionnairesTous(String trier);

	/**
	 * Recherche d'un questionnaire par son identifiant
	 * 
	 * @param id
	 *            identifiant du questionnaire
	 * @return Le questionnaire recherché
	 */
	public Questionnaire getQuestionnaireParId(Long id);

	/**
	 * Supprime le questionnaire
	 * 
	 * @param id
	 *            Id du questionnaire à supprimer
	 */
	public void supprimerQuestionnaire(Long id);

	/**
	 * Met l'état test au questionnaire
	 * 
	 * @param id
	 *            Identifiant du questionnaire
	 * @throws ServiceException
	 *             Si le questionnaire n'est pas trouvé
	 */
	public void mettreQuestionnaireEnTest(Long id) throws ServiceException;

	/**
	 * Met l'état publié au questionnaire
	 * 
	 * @param id
	 *            Identifiant du questionnaire
	 * @throws ServiceException
	 *             Si le questionnaire n'est pas trouvé
	 */
	public void mettreQuestionnaireEnPublication(Long id)
			throws ServiceException;

	/**
	 * Fixe le questionnaire en l'état périmé
	 * 
	 * @param id
	 *            Identifiant du questionnaire dont il faut changer l'état
	 * @throws ServiceException
	 *             Si le questonnaire n'est pas trouvé
	 */
	public void mettreQuestionnaireEnPerime(Long id) throws ServiceException;

	/**
	 * Met l'état test au questionnaire
	 * 
	 * @param id
	 *            Identifiant du questionnaire
	 * @throws ServiceException
	 *             Si le questionnaire n'est pas trouvé
	 */
	public void mettreQuestionnaireEnTravail(Long id) throws ServiceException;

	/**
	 * Liste tous les questionnaires publiés
	 * 
	 * @return La liste des questionnaires publiés
	 */
	public List<Questionnaire> listerQuestionnairesEnPublication();

	/**
	 * @param questionnaire
	 *            Questionnaire relatif à l'instance
	 * @param auteur
	 *            Auteur du questionnaire
	 * @return L'instance du questionnaire
	 */
	public InstanceQuestionnaire nouveauInstanceQuestionnaire(
			Questionnaire questionnaire, Utilisateur auteur);

	/**
	 * Enregistre une instance de questionnaire
	 * 
	 * @param instanceQuestionnaire
	 *            instance à enregistrer
	 * @return l'instance enregistrée
	 */
	public InstanceQuestionnaire enregistrerInstanceQuestionnaire(
			InstanceQuestionnaire instanceQuestionnaire);

	/**
	 * Permet de chercher toutes les instances attachées au questionnaire dont
	 * l'identifiant est spécifié en paramètre
	 * 
	 * @param numeroQuestionnaire
	 *            identifiant du questionnaire dont on souhaite trouver toutes
	 *            les instances attachées
	 * @return La lise de instances de questionnaire recherchée
	 */
	public List<InstanceQuestionnaire> getInstancesQuestionnaireParQuestionnaireId(
			Long numeroQuestionnaire);

	/**
	 * Retourne l'instance de questionnaie identifiée par le paramètre
	 * 
	 * @param id
	 *            Identifiant de l'instance
	 * @return L'instance de questionnaire recherchée.
	 */
	public InstanceQuestionnaire getInstanceQuestionnaireParId(Long id);

	// public byte[] getFichierValeurFichier(Integer idFichier);

	/**
	 * Retourne le fichier identifié par le paramètre
	 * 
	 * @param idFichier
	 *            Identifiant du fichier
	 * @return La valeur du fichier recherché
	 */
	public ValeurFichier getValeurFichier(Long idFichier);

	/**
	 * Permet d'enregistrer une instance de questionnaire en cours de rédaction
	 * 
	 * @param instanceQuestionnaire
	 *            Instance partielle de questionnaire à enregistré
	 * @return L'instance partielle de questionnaire enregistrée
	 */
	public InstanceQuestionnaire enregistrerInstanceQuestionnairePartiel(
			InstanceQuestionnaire instanceQuestionnaire);

	/**
	 * Retourne la liste des instances de questionnaire en cours (partielles) de
	 * l'utilisateur
	 * 
	 * @param utilisateur
	 *            Utilisateur dont on cherche les instances de questionnaire
	 * @return La liste des instances de questionnaire recherchée
	 */
	public List<InstanceQuestionnaire> getInstancesQuestionnaireEnCoursParUtilisateur(
			Utilisateur utilisateur);

}
